package dinucleotides;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

public final class Fichiers {

	private Fichiers() {

	}

	/** Écriture des valeurs résultats dans le fichier fileName
	 * @param fileName
	 * @param data
	 */
	public static void ecrireFichier(String fileName, int[] data) {
		ecrireFichierPrive(fileName,data,null);
	}
	
	/** Écriture des data dans le fichier fileName
	 * @param fileName
	 * @param data
	 */
	public static void ecrireFichier(String fileName, List<Code> data) {
		ecrireFichierPrive(fileName,null,data);
	}
	
	/** Écriture des données dans les fichiers
	 * @param fileName
	 * @param data
	 * @param codes
	 */
	private static void ecrireFichierPrive(String fileName, int[] data, List<Code> codes) {
		// Création du dossier si inexistant
		if (!initFolderResults()) {
			Main.getLogger().severe("Le programme n'arrive pas à créer le dossier.");
			return;
		}
		
		// Création du fichier
		File f = new File(Main.DOSSIER_RESULTAT + File.separatorChar + fileName);

		PrintWriter fout = null;
		boolean fichierExists = true;
		
		try {
			if (!f.exists()) {
				fichierExists = f.createNewFile();
			}

			if (fichierExists) {
				// Écriture dans le fichier
				fout = new PrintWriter(new FileWriter(f));
				if (data != null) {
					ecrireDonnees(fout, data);
				}
				else if (codes != null) {
					ecrireDonnees(fout, codes);
				}
			}
		} catch (IOException e) {
			Main.getLogger().throwing("Fichiers.java", "ecrireFichierPrive(String fileName, int[] data, List<Code> codes)", e);
		} finally {
			if (fout != null) {
				fout.close();
			}
		}
	}
	
	/** Formate les données dans le fichier
	 * @param fout
	 * @param data
	 */
	private static void ecrireDonnees(PrintWriter fout, int[] data) {
		for (int i=0;i<data.length;i++) {
			if (i!=0) {
				fout.print(" ");
			}
			fout.print(data[i]);
		}
		fout.println();// Pour finir le fichier par une ligne vide
	}
	
	/** Formate les codes dans le fichier
	 * @param fout
	 * @param codes
	 */
	private static void ecrireDonnees(PrintWriter fout, List<Code> codes) {
		for (int i=0;i<codes.size();i++) {
			if (i!=0) {
				fout.println();
			}
			fout.print(codes.get(i).toString());
		}
		fout.println();// Pour finir le fichier par une ligne vide
	}
	
	/** Initialisation du dossier contenant les fichiers résultats
	 * @return : si la création du dossier c'est bien passé
	 */
	public static boolean initFolderResults() {
		// Création du dossier si inexistant
		File d = new File(Main.DOSSIER_RESULTAT);
		boolean dossierOk = true;
		
		if (!d.exists()) {
			// si le dossier n'existe pas, on le crée
			dossierOk = d.mkdir();
		}
		
		return dossierOk;
	}
}